package net.sisgac.atencion_cliente.model.dao.jpa;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import net.sisgac.atencion_cliente.model.SolicitudServicio;
import net.sisgac.atencion_cliente.model.dao.SolicitudServicioDAO;
import net.sisgac.despacho_mercaderia.model.OrdenServicio;


@SuppressWarnings("unchecked")
public class JPASolicitudServicioDAO implements SolicitudServicioDAO {
	
	private Log log = LogFactory.getLog(getClass());

	private EntityManager em;
	
	public JPASolicitudServicioDAO(EntityManager em){
		this.em=em;
	}
	
	public SolicitudServicio insert(SolicitudServicio o) {
		// TODO Auto-generated method stub
		em.persist(o);
		return o;
	}
	
	
	public List<SolicitudServicio> findAll() {
		// TODO Auto-generated method stub
		Query query=em.createQuery("SELECT o FROM SOLICITUD_SERVICIO o");
		return query.getResultList();
	}
	@Override
	public List<SolicitudServicio>  find(SolicitudServicio o){
		StringBuilder sql =new StringBuilder();
		sql.append("Select o From SolicitudServicio o Where ");
		List<String> criteria = new ArrayList<String>();
		if(o.getIdsolicitudservicio()!=0) criteria.add("o.idsolicitudservicio=:idsolicitudservicio");
		if(o.getFechasolicituds()!=null) criteria.add("o.fechasolicituds=:fechasolicituds");
		if(o.getDepartamentodestinatario()!=null) criteria.add("o.departamentodestinatario=:departamentodestinatario");
		
		
		if(criteria.size()==0){
			throw new RuntimeException("No existen criterios para la consulta");
		}
		for(int i=0;i<criteria.size();i++){
			if(i>0){ sql.append(" Or ");	}
			sql.append(criteria.get(i));
		}
		Query query=em.createQuery(sql.toString());
		if(o.getIdsolicitudservicio()!=0) query.setParameter("idsolicitudservicio", o.getIdsolicitudservicio());
		if(o.getFechasolicituds()!=null) query.setParameter("fechasolicituds", o.getFechasolicituds());
		if(o.getDepartamentodestinatario()!=null) query.setParameter("departamentodestinatario", o.getDepartamentodestinatario());
		
		List<SolicitudServicio> solicitudServicio=null;
		try{
			solicitudServicio=(List<SolicitudServicio> )query.getResultList();
		}catch(NoResultException ex){
			log.warn("No hay resultados de la consulta"+ex.getMessage());
		}
		return solicitudServicio; 
	}
	
	@Override
	public SolicitudServicio findById(int id) {
		Query query=em.createQuery("SELECT o FROM SOLICITUD_SERVICIO o WHERE IDSOLICITUDSERVICIO=:id");
		query.setParameter(id, id);
		return (SolicitudServicio) query.getResultList();
	}

	@Override
	public List<SolicitudServicio> findByDate(String fecha) {
		Query query=em.createQuery("SELECT o FROM SOLICITUD_SERVICIO o WHERE FECHASOLICITUDS=:fecha");
		query.setParameter(fecha, fecha);
		return query.getResultList();
	}

	

}
